/* eslint-disable no-unused-vars */
import axios from 'axios'
import FingerprintJS from'@fingerprintjs/fingerprintjs'
const service = axios.create({
  // baseURL: process.env.NODE_ENV === 'development' ? '/api':'',  //这里可以通过baseurl 跨域  如果项目为多个域名就跟在api地址前面，只有一个域名就写到 此处得baseURL 上面
  timeout: 1000 * 60,
});
// console.log('processprocess', process);
// 获取当前环境变量



const { NODE_ENV, VUE_APP_API, VUE_APP_BASE_URLAPI, VUE_APP_BASE_URLOTA } = process.env || {};

//= ======================S axios公共配置 =============================

// 添加请求拦截器
service.interceptors.request.use(config => {
  const method = config.method.toUpperCase();
  if (method === 'GET')
  {
    config.headers = {
      ...config.headers,
      "Content-Type": "application/x-www-form-urlencoded",
      "Accept": "*/*"
    }
  }
  // if(token){
  // config.headers.Authorization = 123456798;
  // }

  // 根据当前环境变量设置baseURL
  // NODE_ENV === "development" ? (config.baseURL = VUE_APP_BASE_URL ): (config.baseURL = VUE_APP_API);

  config.method === 'post' && (config.data = { ...config.data });

  ['get', 'GET'].includes(config.method) && (config.params = config.data);

  return config
}, err => {
  return Promise.reject(err)
});

// 添加响应拦截器
service.interceptors.response.use(response => {
  try
  {
    /**
     * @name status 状态码
     * @name data 后端返回得数据
     * @name request axios 请求提
     * @name statusText 状态描述
     */

    const { status, data: serverSendData, request, statusText } = response;

    // 判断HTTP 状态码是否正确
    if (status > 200 || status < 400)
    {
      return serverSendData;
    } else
    {
      // Message({
      //   type: 'error',
      //   message: '请求服务端异常'
      // });
      return false;
    }

  } catch (e)
  {
    return Promise.reject(new Error('服务端返回体数据结构错误'))
  }

}, error => {
  const { response, code, message } = error;
  if (!navigator.onLine)
  {
    console.log('当前网络不可用')
  } else if (code === "ECONNABORTED" || message === "Network Error")
  {
    console.log('请求超时')
  } else
  {
    // Message({
    //   type: 'error',
    //   message: error
    // });
  }
  return Promise.reject(error)

});

/***
 * @samplecode 示例代码
 * service({
      url: '/ota/queryScopeCar',
      method: 'post',
      data：{}, // 发送数据
      isDataAll:false // 自定义参数 可在service.interceptors.request.use(config=>{}) 中获取
    })
 *
 */

const http = (url, params, method = "post", config = { "dataType": "JSON", "dataAll": true }) => {

  const backUp = { "dataType": "JSON", "dataAll": false };

  const CONFIGDATA = { ...backUp, ...config };

  const { dataType, dataAll } = CONFIGDATA;

  return new Promise((resolve, reject) => {
    service({
      url,
      dataType,
      method,
      data: params, // 发送数据
      isDataAll: false // 自定义参数 可在service.interceptors.request.use(config=>{}) 中获取
    }).then(({ status, data: serverSendData, request, statusText }) => {
      console.log(codeSwitch(serverSendData, dataAll));
      serverSendData && status >= 200 && status < 400 && resolve(codeSwitch(serverSendData, dataAll))
    })
  })
}

//= ======================E axios公共配置 =============================

/***
 *  二次定义 axios 前面配置对此函数是生效的
 * @param url 请求地址 string
 * @param params 请求参数 any
 * @param method 请求方式
 * @param config 配置 Object
 * @returns {Promise<any>}
 * @constructor
 */

const XHTHttpRequest =  (url, params, method = "post", config = { "dataType": "JSON", "dataAll": true }) => {


  // 防止传入一个参参数导致后满数据要的数据不对
  const backUp = { "dataType": "JSON", "dataAll": false };

  const CONFIGDATA = { ...backUp, ...config };

  const { dataType, dataAll } = CONFIGDATA;

  return new Promise(async (resolve, reject) => {
  let fingerprint = '';

   try {
     fingerprint = await  FingerprintJS.load().then(fp => fp.get()) .then(result => result)
     console.log(fingerprint,'ddd')
   }catch (e) {
     // console.log(e)
   }

    /**
     * @name status 状态码
     * @name data 后端返回得数据
     * @name request axios 请求提
     * @name statusText 状态描述
     */
    method = method.toUpperCase();
    axios({
      url,
      dataType,
      method,
      headers: {
        'Content-Type': method === 'GET' ? 'application/x-www-form-urlencoded' : "application/json",
        "Authorization" : fingerprint && fingerprint?.visitorId
      },
      baseURL: VUE_APP_BASE_URLAPI,
      // baseURL: NODE_ENV === 'development' ? VUE_APP_BASE_URLAPI :'', // 这里可以通过baseurl 跨域  如果项目为多个域名就跟在api地址前面，只有一个域名就写到 此处得baseURL 上面
      data: ['POST', 'post'].includes(method) ? params : null,
      params: ['GET', 'get'].includes(method) ? params : null
    }).then(({ status, data: serverSendData, request, statusText }) => {
      serverSendData && status >= 200 && status < 400 && resolve(codeSwitch(serverSendData, dataAll))
    })
  });

};


const XHTHttpRequestOTA = (url, params, method = "post", config = { "dataType": "JSON", "dataAll": false }) => {

  const backUp = { "dataType": "JSON", "dataAll": false }; const CONFIGDATA = { ...backUp, ...config }; const { dataType, dataAll } = CONFIGDATA;

  // return new Promise(async (resolve, reject) => {

  //   /**
  //    * @name status 状态码
  //    * @name data 后端返回得数据
  //    * @name request axios 请求提
  //    * @name statusText 状态描述
  //    */

  //   try
  //   {
  //     const { status, data: serverSendData, request, statusText } = await axios({
  //       url,
  //       dataType,
  //       method,
  //       baseURL: VUE_APP_BASE_URLOTA,
  //       // baseURL: NODE_ENV === 'development' ? VUE_APP_BASE_URLOTA :'', // 这里可以通过baseurl 跨域  如果项目为多个域名就跟在api地址前面，只有一个域名就写到 此处得baseURL 上面
  //       data: ['POST', 'post'].includes(method) ? params : null,
  //       params: ['GET', 'get'].includes(method) ? params : null
  //     }).catch(error => reject(error));

  //     serverSendData && status === 200 ? resolve(codeSwitch(serverSendData, dataAll)) : Promise.reject(serverSendData);

  //   } catch (e)
  //   {
  //     return Promise.reject(new Error('服务端返回体数据结构错误'))
  //   }
  // });

};

/**
 * 后端返回数据进行枚举判断
 * @param {Object} code 后端返回的 状态码
 * @param {Object} msg 后端返回的描述
 * @param {Object} dataBody 后端返回数据
 */

const codeSwitch = (dataBody, isAll) => {

  const { message, code, data } = dataBody;

  switch (code)
  {
    // 当请求返回是的状态码正确是才返回数据
    case 200:
      return isAll ? data : dataBody;
    case 500:
      console.log('状态码异常', message);
      return Promise.reject(dataBody);
    default:
      console.log(`状态码${code}异常：${message}`,);

      return Promise.reject(dataBody)
  }

};

/***
 *
 * 二个函数是一样得，只是传递传输不一样
 *  RequestHttp  需要对象得形式，必须安装 axios 规定得传参方式
 *
 *  xhr 参数参考 XHTHttpRequest 这个函数
 */
export {
  service as RequestHttp,
  XHTHttpRequest as xhr,
  XHTHttpRequestOTA as xhrOTA,
  http
}
